iT邦幫忙

2022 iThome 鐵人賽

DAY 3
1
Modern Web

速成 Phoenix, 2022年最受喜愛框架系列 第 3

{03, Elixir, "變數與型別"}

  • 分享至 

  • xImage
  •  

Elixir 是 動態型別 + 強型別
也就是不必為變數規定型別,處理不同型別的資料時不會幫我們自動處理。
這邊帶大家介紹這系列常用到的型別與要注意的點

我們在 iex 裡面進行

打開 iex

iex

向前一篇最後練習的一樣,我們每一行送出之後都會直接執行,回傳結果

iex> 1 + 1
2

定義變數

Elixir 裡面定義變數不需要先宣告,直接訂下變數與它的值即可

name = "強哥"

Snake Case

通常變數在 elixir 裡面慣例都是使用 snake case

new_price = 3
a_very_long_variable = "很長的變數"

字串(String)

"我是字串"

最常用的大概是字串吧,就是文字拉,在 elixir 裡面我們的字串是用兩個 " 包起來,這邊要注意的是要用雙引號哦!

知道一下就好,用單引號(')的話是 用文字表示的 串列(List) ,這個系列先記得不能跟字串混用即可

我們可以用 <> 來做字串相接

iex> "foo" <> "bar"
"foobar"

多行字串

"""
第一行
第二行
第三行
"""

字串我們常常使用 String 模組來操作

String 模組方法列表

例如

  • split
iex> String.split("foo bar")
["foo", "bar"]
  • downcase
iex> String.downcase("ELIxir")
"elixir"

數字(常數) (Integer)

加減乘除

像大部分的程式語言一樣都有做加減乘除
唯一要注意的是 /,用 / 除過的結果會變成有小數點的 float 而不是 integer

如果要維持 integer 可以使用 div 方法

iex> div(5, 2)
2

String 模組

跟字串一樣,也有提供一個叫 String模組來放操作 string 的方法們

型別轉換

如果需要轉換型別,通常模組內都會有相對應的方法可以使用
這邊列出常用的

iex> String.to_integer("3310")
3310

iex> Integer.to_string(1234)
"1234"

布林值 (Boolean) 與 nil

true false

Elixir 跟很多語言一樣有 truefalse

iex> 3 > 2
true
iex> 3 < 2
false
iex> 3 >= 2
true
iex> 3 <= 2
false
iex> 3 == 3
true
iex> 3 != 2
true

nil

nil 是空值的意思

常常在使用方法找不到結果的時候拿到,例如

iex> String.at("abc", 6)
nil

這個 String 模組的方法 at 要找 "abc" 裡面的第 7 個字母(從0開始算),但是 "abc" 只有三個,通常這種尋找的方法找不到的話都會回傳空值 nil。

在 Elixir 裡,只有 false 與 nil 在判斷式裡是 falsy(否定),true 與 其他任何值(包含 0 與空字串) 都是 truthy(肯定)

if nil do
  "不會執行這邊"
else
  "因為 nil 是 falsy,這邊會被執行"
end

atom

atom 長這樣 用 : 開頭的英文字

:atom
:another_atom

atom 是常數
他的名稱就代表他的值
可以想像成像文字模式的數字

iex> :foo == :bar
false

其實 Elixir 裡的 true, false, nil 都是 atom

iex> :false == false
true

另外後面會提到的 Module 名稱也是

之後在寫 elixir 會有發現有很多方法如果執行成功的話會回傳 atom :ok 失敗的時候回回傳 atom :error

List 串列

Elixir 的 list 可以放進不同型態的值

[1, "foo", :bar]

串接 list

iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]

Elixir 一樣也有 List 模組 提供操作 list 的方法們

使用 List.last 取得 list 內的最後一個

iex> List.last([1, 2, 3])
3

Tuple 元組

長這樣

{:ok, 3}

他跟 list 相當像但修改時比較沒效率,不過我們先不用擔心這些

tuple 常常用在方法的回傳值,尤其是有用到外部資源,如資料庫或檔案的方法

iex> File.read("存在的/檔案/路徑")
{:ok, "檔案內容"}

iex> File.read("不存在的/檔案/路徑")
{:error, :enoent}

Map 映射

map 用來放有標籤內容相對的資料,例如

%{"名稱" => "強尼"}

如果 key 是 atom 的話,可以被簡寫成

%{name: "John"}

大部分需要有鍵值對應的資料都是用這個格式存

Map 模組提供的方法

從 map 裡面刪除指定 key 的值

iex> Map.delete(%{a: 1, b: 2}, :a)
%{b: 2}

合併兩個 map

iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4})
%{a: 3, b: 2, d: 4}

Keyword List 關鍵字串列

其實 keyword list 就是 list 與 tuple 的組合
在 list 裡面裝由 一個 atom 與 一個內容組成的 tuple 們

[{:foo, :bar}, {:name, "Jack"}, {:name, "Dan"}]

會被簡寫成

[foo: :bar, name: "Jack", name: "Dan"]

跟 map 很像但是 keyword list 的 key 值可以重複,有順序關西,key 必須是 atom。

常常在需要額外選像當變數的方法變數裡面用到。

Keyword模組

從 Keyword list 裡面取出 key 為 :a 的值

Keyword.get([a: 1], :a)
1

Enum 模組

列舉 (enumerable)
這邊要特別提一下 Enum 模組,他算是最常用的內建模組了,它內建了操作多個資料集合的各種方法,可以用在 List, Map, Keyword list

Enum 模組方法

使用 Enum.sort 來排序 list

iex> Enum.sort([4, 1, 3, 2])
[1, 2, 3, 4]

上一篇
{02, Elixir, "最難的是安裝環境"}
下一篇
{04, Elixir, "模組與方法"}
系列文
速成 Phoenix, 2022年最受喜愛框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言